## 3.9. Two Copies of Apache

To illustrate the possibilities, we will run two copies of Apache with different IP addresses on different consoles, as if they were on two completely separate machines. This is not something you want to do often, but for the sake of completeness, here it is. Normally, you would only bother if the different virtual hosts needed very different configurations, such as different values for `ServerType`, `User`, `TypesConfig`, or `ServerRoot` (none of these directives can apply to a virtual host, since they are global to all servers, which is why you have to run two copies to get the desired effect). If you are expecting a lot of hits, you should try to avoid running more than one copy, as doing so will generally load the machine more.

In our case, we don't have any real need to run two copies; however, we will go this route for the sake of education. You can find the necessary machinery in ... /site.twocopy. There are two subdirectories: customers and sales.

The Config file in ... /customers contains the following:

>     User webuser
>     Group webgroup
>     ServerName www.butterthlies.com
>     DocumentRoot /usr/www/site.twocopy/customers/htdocs
>     BindAddress www.butterthlies.com
>     TransferLog logs/access_log

In ... /sales the Config file is:

>     User webuser
>     Group webgroup
>     ServerName sales.butterthlies.com
>     DocumentRoot /usr/www/site.twocopy/sales/htdocs
>     Listen sales-not-vh.butterthlies.com:80
>     TransferLog logs/access_log

On this occasion, we will exercise the sales-not-vh.butterthlies.com URL. For the first time, we have more than one copy of Apache running, and we have to associate requests on specific URLs with different copies of the server. There are three more directives to do this.

### 3.9.1. BindAddress

>     BindAddress addr
>     Default addr: any
>     Server config

This directive forces Apache to bind to a particular IP address, rather than listening to all IP addresses on the machine.

### 3.9.2. Port

>     Port port
>     Default port: 80
>     Server config

When used in the main server configuration (i.e., outside any `<VirtualHost>` sections) and in the absence of a `BindAddress` or `Listen` directive, the `Port` directive sets the port number on which Apache is to listen. This is for backward compatibility, and really you should use `BindAddress` or `Listen`.

When used in a `<VirtualHost>` section, this specifies the port that should be used when the server generates a URL for itself (see also `ServerName` and `UseCanonicalName`). It does not set the port the virtual host listens on -- that is done by the `<VirtualHost>` directive itself.

### 3.9.3. Listen

>     Listen hostname:port
>     Server config

`Listen` tells Apache to pay attention to more than one IP address or port. By default it responds to requests on all IP addresses, but only to the port specified by the `Port` directive. It therefore allows you to restrict the set of IP addresses listened to and increase the set of ports.

`Listen` is the preferred directive; `BindAddress` is obsolete, since it has to be combined with the `Port` directive if any port other than 80 is wanted. Also, more than one `Listen` can be used, but only a single `BindAddress`.

There are some housekeeping directives to go with these three.

### 3.9.4. ListenBacklog

>     ListenBacklog number
>     Default: 511
>     Server config

Sets the maximum length of the queue of pending connections. Normally, doing so is unnecessary, but it can be useful if the server is under a TCP SYN flood attack, which simulates lots of new connection opens that don't complete. On some systems, this causes a large backlog, which can be alleviated by setting the `ListenBacklog` parameter. Only the knowledgeable should do this. See the `backlog` parameter in the manual entry for `listen(2)`.

Back in the Config file,`DocumentRoot`, as before, sets the arena for our offerings to the customer. `ErrorLog` tells Apache where to log its errors, and `TransferLog` its successes. As we will see in Chapter 11, "What's Going On?" , the information stored in these logs can be tuned.

### 3.9.5. ServerType

>     ServerType [inetd|standalone]
>     Default: standalone
>     Server config

The `ServerType` directive allows you to control the way in which Apache handles multiple copies of itself. The arguments are `inetd` or `standalone` (the default).

`inetd`

  You might not want Apache to spawn a cloud of waiting child processes at all, but to start up a new one each time a request comes in and exit once it has been dealt with. This is slower, but consumes fewer resources when there are no clients to be dealt with. However, this method is deprecated by the Apache Group as being clumsy and inefficient. On some platforms it may not work at all, and the Group has no plans to fix it. The utility inetd is configured in /etc/inetd.conf (see`` man inetd ). The entry for Apache would look something like this:

>     http stream tcp nowait root /usr/local/bin/httpd httpd -d directory

`standalone`

  The default; allows the swarm of waiting child servers.

Having set up the customers, we can duplicate the block, making some slight changes to suit the salespeople. The two servers have different `DocumentRoot`s, which is to be expected because that's why we set up two hosts in the first place. They also have different error and transfer logs, but they do not have to. You could have one transfer log and one error log, or you could write all the logging for both sites to a single file.

Type `go` on the server; while on the client, as before, access http://www.butterthlies.com or http://sales.butterthlies.com/.

The files in ... /sales/htdocs are similar to those on ... /customers/htdocs, but altered enough that we can see the difference when we access the two sites. index.html has been edited so that the first line reads:

>     <h1>SALESMEN Index to Butterthlies Catalogs</h1>

The file catalog_summer.html has been edited so that it reads:

>     <h1>Welcome to the great rip-off of '97: Butterthlies Inc</h1>
>     <p>All our worthless cards are available in packs of 20 at $1.95 a pack.
>     WHAT A FANTASTIC DISCOUNT! There is an amazing FURTHER 10% discount if you
>     order more than 100. </p> ...

and so on, until the joke gets boring. Now we can throw the great machine into operation. From console 1 (on FreeBSD hit ALT-F1), get into ... /customers and type:

>     % ./go

The first Apache is running. Now get into .../customers and again type:

>     % ./go

Now, as the client, you log on to http://www.butterthlies.com/ and see the customers' site, which shows you the customers' catalogs. Quit, and metamorphose into a voracious salesperson by logging on to http://sales.butterthlies.com/. You are given a nasty insight into the ugly reality beneath the smiling face of commerce!

Copyright © 2001 O'Reilly & Associates. All rights reserved.